var array = [1, [2, [3, 4]]]

console.log(array.flat()) // 这个方法只能展开一层
var result = []


function sortA (arr) {
  arr.forEach(item => {
    // 方法注意递归栈。应该先判断是否为数字。经验是判断 if else 的时候先判断简单的bug 出现频率会少
    if (Object.prototype.toString.call(item) === '[object Number]') {
      result = [...result, item]
    } else {
      arguments.callee(item)
    }
  })
}

sortA(array)

console.log(result)


function flat(arr, result = []) {
  arr.forEach(item => {
    if (!Array.isArray(item)) {
      // 这儿一定要使用 push 修改，在遍历的过程中每一次都将要输出的数组进行修改。如果使用 result = [...result, item],其实是将 result 指向了另一个地方，原来的还在那儿。最后返回结果是第一次处理的结果。因为 result 指向第一次的处理结果。可以通过分析递归栈得到结论
      result.push(item) 
    } else {
      flat(item, result)
    }
  })
  return result
}
console.log(flat(array))